/**
 *	@file	picture.c
 *	@brief	写真セーブデータ
 *	@author	Miyuki Iwasawa
 *	@date	08.05.22
 */

#include "common.h"
#include "savedata/savedata.h"
#include "savedata/mystatus.h"
#include "savedata/picture.h"
#include "savedata/picture_util.h"
#include "poketool/poke_tool.h"
#include "poketool/pokeparty.h"
#include "system/pms_data.h"
#include "system/buflen.h"
#include "system/pm_str.h"

struct _PICTURE_SAVE{
	int	num;	///<現在の有効データ数
	PICTURE_DATA	data[PICTURE_DATA_MAX];
};

//////////////////////////////////////////////////////////////////////////
///プロトタイプ
//////////////////////////////////////////////////////////////////////////
static void picCamera_Clear(PIC_CAMERA_DATA* dat);
static void picPoke_Clear(PIC_POKE_DATA* dat);


//////////////////////////////////////////////////////////////////////////
///グローバル　セーブデータブロック
//////////////////////////////////////////////////////////////////////////
/**
 *	@brief	写真セーブデータサイズ取得
 */
int PictureSv_GetWorkSize(void)
{
	return sizeof(PICTURE_SAVE);
}
/**
 *	@brief	セーブデータブロックへのポインタを取得
 */
PICTURE_SAVE* SaveData_GetPictureSave(SAVEDATA* sv)
{
	return SaveData_Get(sv,GMDATA_ID_PICTURE_SAVE);
}

/**
 *	@brief	写真セーブデータ初期化
 */
void PictureSv_Init(void* sv)
{
	int i;
	PICTURE_SAVE* wk = (PICTURE_SAVE*)sv;

	wk->num = 0;
	for(i = 0;i < PICTURE_DATA_MAX;i++){
		PictureData_Clear(&wk->data[i]);
	}
}

/*
 *	@brief	空いているデータ領域indexを返す
 *
 *	@return	u8	データを追加できる場合は参照ID
 *				追加できない場合はPICTURE_ID_NULL= 0xFFが返る
 */
PICTURE_ID PictureSave_SearchNullID(PICTURE_SAVE* sv)
{
	u8 i;

	for(i = 0;i < PICTURE_DATA_MAX;i++){
		if(!PictureData_IsEnable(&sv->data[i])){
			return i;
		}
	}
	return PICTURE_ID_NULL;
}

/**
 *	@brief	セーブ内の有効な写真データ数を取得する
 */
u8 PictureSave_PictureDataNum(PICTURE_SAVE* sv)
{
	u8 i,num;

	for(i = 0,num = 0;i < PICTURE_DATA_MAX;i++){
		if(PictureData_IsEnable(&sv->data[i])){
			++num;
		}
	}
	return num;
}

/**
 *	@brief	指定写真データ削除
 */
void PictureSave_DelPictureDataSingle(PICTURE_SAVE* sv,PICTURE_ID idx)
{
	if(idx >= PICTURE_DATA_MAX){
		return;
	}
	PictureData_Clear(&sv->data[idx]);
	return;
}
/**
 *	@brief	写真データを指定indexにセット
 */
BOOL PictureSave_SetPictureDataSingle(PICTURE_SAVE* sv,const PICTURE_DATA* dat,PICTURE_ID idx)
{
	if(idx >= PICTURE_DATA_MAX){
		return FALSE;
	}
	MI_CpuCopy8(dat,&sv->data[idx],sizeof(PICTURE_DATA));
	return TRUE;
}

/**
 *	@brief	指定indexの写真データを取得
 */
BOOL PictureSave_GetPictureDataSingle(PICTURE_SAVE* sv,PICTURE_DATA* dat,PICTURE_ID idx)
{
	if(idx >= PICTURE_DATA_MAX){
		PictureData_Clear(dat);
		return FALSE;
	}
	MI_CpuCopy8(&sv->data[idx],dat,sizeof(PICTURE_DATA));
	return TRUE;
}

/**
 *	@brief	セーブデータ内の全ての写真データをアロケートしたメモリに取得する
 *
 *	＊FreeMemoryEzで自前で解放すること！
 *
 */
PICTURE_DATA* PictureSave_AllocPictureDataArray(PICTURE_SAVE* sv,int heapID)
{
	u8 num,i,idx;
	PICTURE_DATA* dat;

	num = PictureSave_PictureDataNum(sv);

	dat = sys_AllocMemory(heapID,sizeof(PICTURE_DATA)*num);
	MI_CpuClear8(dat,sizeof(PICTURE_DATA)*num);

	idx = 0;
	for(i = 0;i < PICTURE_DATA_MAX;i++){
		if(!PictureData_IsEnable(&sv->data[i])){
			continue;
		}
		MI_CpuCopy8(&sv->data[i],&dat[idx++],sizeof(PICTURE_DATA));
	}
	return dat;
}



///////////////////////////////////////////////////////////////////////////
//写真データ関連
///////////////////////////////////////////////////////////////////////////
/**
 *	@brief	写真データ構造体クリア
 */
void PictureData_Clear(PICTURE_DATA* dat)
{
	MI_CpuClear8(dat,sizeof(PICTURE_DATA));

	PM_strclearEOM_(dat->name,BUFLEN_PERSON_NAME);
	PM_strclearEOM_(dat->poke_name,BUFLEN_POKEMON_NAME);
}

/*
 *	@brief	写真データが有効かどうか返す
 */
BOOL PictureData_IsEnable(PICTURE_DATA* dat)
{
	if(dat->poke_num == 0){
		return FALSE;
	}
	return TRUE;
}

/**
 *	@brief	写真データ生成
 *
 *	@param	dat
 *	@param	save
 *	@param	pc		カメラパラメータを格納した構造体への参照ポインタ
 *	@param	zoneID	プレイヤー現在位置情報(zone)
 *	@param	px		プレイヤー現在位置情報(player_x)
 *	@param	pz		プレイヤー現在位置情報(player_z)
 *	@param	form	自機の形態
 *
 */
void PictureData_MakePicture(PICTURE_DATA* dat,
	SAVEDATA* save,PIC_CAMERA_DATA* pc,u16 zoneID,u16 px,u16 pz,u8 form)
{
	int i;
	MYSTATUS * my =SaveData_GetMyStatus( save );
	POKEPARTY * party = SaveData_GetTemotiPokemon( save );

	PictureData_Clear(dat);

	dat->poke_num = PokeParty_GetPokeCount(party);
	dat->tr_sex = MyStatus_GetMySex(my);
	dat->form = form;
	dat->x = px;
	dat->z = pz;
	dat->zoneID = zoneID;

	//カメラパラメータセット
	MI_CpuCopy8( pc,&dat->camera,sizeof(PIC_CAMERA_DATA));

	//ポケモンパラメータセット
	for(i=0;i<dat->poke_num;i++){
		POKEMON_PARAM* param;
		param = PokeParty_GetMemberPointer(party, i);
		dat->poke[i].monsNo = PokeParaGet(param, ID_PARA_monsno, NULL);
		dat->poke[i].form = PokeParaGet(param, ID_PARA_form_no, NULL);
		dat->poke[i].rare = PokeRareGet(param);
		dat->poke[i].sex = PokeParaGet(param, ID_PARA_sex, NULL);
	}
}

///////////////////////////////////////////////////////////////////////////
//ローカル
///////////////////////////////////////////////////////////////////////////
/**
 *	@brief	写真カメラデータ構造体クリア
 */
static void picCamera_Clear(PIC_CAMERA_DATA* dat)
{
	MI_CpuClear8(dat,sizeof(PIC_CAMERA_DATA));
}

/**
 *	@brief	写真ポケモンデータ構造体クリア
 */
static void picPoke_Clear(PIC_POKE_DATA* dat)
{
	MI_CpuClear8(dat,sizeof(PIC_POKE_DATA));
}